package cl.golive.d2menu.utils.modeloUtils;

import cl.golive.d2menu.obj.Compra;
import cl.golive.d2menu.obj.Plato;
import java.util.Arrays;
import java.util.Collections;
import java.util.Comparator;
import java.util.Vector;
import javax.swing.table.AbstractTableModel;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableModel;

/**
 *
 * @author whyem
 */
public class CompraTableModel extends DefaultTableModel implements TableModel {

    private boolean hayRepetidos = false;

    public CompraTableModel() {
        super();
    }

    public void addCustomRowCompra(Plato plato, CompraTableModel currentModel) {
        Object[] rowData = new Object[7];

        rowData[0] = calcularCantidadRepetidos(plato, currentModel);
        rowData[1] = plato.getPlatoId();
        rowData[2] = plato.getCategoriaId();
        rowData[3] = plato.getNombrePlato();
        rowData[4] = plato.getDetallePlato();
        rowData[5] = calcularPrecioRepetidos(plato, currentModel);
        rowData[6] = plato.getNombreImagen();

        if (hayRepetidos) {
            removerFilaRepetida(plato.getPlatoId(), currentModel);
        }

        super.addRow(rowData);
    }

    public Compra getItemPlatoCompraAt(int rowIndex, CompraTableModel currentModel) {
        Compra platoCompra = new Compra();

        Vector dataVector = currentModel.get
        Collections.sort(dataVector);

        Object[] rowData = new Object[7];
        for (int i = 0; i < 7; i++) {
            rowData[i] = currentModel.getValueAt(rowIndex, i);
        }

        platoCompra = mappingObjectToPlatoCompra(rowData);
        return platoCompra;
    }

    /**
     *
     * @param platoCompra
     * @param currentModel
     */
    public void removeCustomRowPlato(Compra platoCompra, CompraTableModel currentModel) {
        if (platoCompra.getCantidad() > 1) {
            removerCantidadPlatoCompra(platoCompra, currentModel);
        } else {
            removerFilaRepetida(platoCompra.getPlatoId(), currentModel);
        }
    }

    private void removerCantidadPlatoCompra(Compra platoCompra, CompraTableModel currentModel) {
        int cantidad = platoCompra.getCantidad();
        for (int i = 0; i < currentModel.getRowCount(); i++) {
            int idPlatoTmp = Integer.parseInt(currentModel.getValueAt(i, 1).toString());
            if (idPlatoTmp == platoCompra.getPlatoId()) {
                removerFilaRepetida(platoCompra.getPlatoId(), currentModel);
                super.addRow(actualizarColumnasEliminacion(platoCompra));
            }
        }
    }

    private Object[] actualizarColumnasEliminacion(Compra platoCompra) {
        Object[] rowData = new Object[7];

        rowData[0] = platoCompra.getCantidad() - 1;
        rowData[1] = platoCompra.getPlatoId();
        rowData[2] = platoCompra.getCategoriaId();
        rowData[3] = platoCompra.getNombrePlato();
        rowData[4] = platoCompra.getDetallePlato();
        rowData[5] = platoCompra.getPrecio() - (platoCompra.getPrecio() / platoCompra.getCantidad());
        rowData[6] = platoCompra.getNombreImagen();

        return rowData;
    }

    /**
     * private int cantidad; private int platoId; private int imagenId; private
     * int categoriaId; private String nombrePlato; private String detallePlato;
     * private int precio; private int estadoPlatoId;
     *
     * @param rowData
     */
    private Compra mappingObjectToPlatoCompra(Object[] rowData) {
        Compra platoCompra = new Compra();

        platoCompra.setCantidad(Integer.parseInt(rowData[0].toString()));
        platoCompra.setPlatoId(Integer.parseInt(rowData[1].toString()));
        platoCompra.setCategoriaId(Integer.parseInt(rowData[2].toString()));
        platoCompra.setNombrePlato(rowData[3].toString());
        platoCompra.setDetallePlato(rowData[4].toString());
        platoCompra.setPrecio(Integer.parseInt(rowData[5].toString()));
        platoCompra.setNombreImagen(rowData[6].toString());

        return platoCompra;
    }

    private int calcularCantidadRepetidos(Plato plato, CompraTableModel currentModel) {
        int cantidad = 1;
        for (int i = 0; i < currentModel.getRowCount(); i++) {
            int idPlatoTmp = Integer.parseInt(currentModel.getValueAt(i, 1).toString());
            if (idPlatoTmp == plato.getPlatoId()) {
                cantidad += Integer.parseInt(currentModel.getValueAt(i, 0).toString());
                this.hayRepetidos = true;
            }
        }
        return cantidad;
    }

    private int calcularPrecioRepetidos(Plato plato, CompraTableModel currentModel) {
        int precio = plato.getPrecio();
        for (int i = 0; i < currentModel.getRowCount(); i++) {
            int idPlatoTmp = Integer.parseInt(currentModel.getValueAt(i, 1).toString());
            if (idPlatoTmp == plato.getPlatoId()) {
                precio += Integer.parseInt(currentModel.getValueAt(i, 5).toString());
                this.hayRepetidos = true;
            }
        }
        return precio;
    }

    private void removerFilaRepetida(int idPlatoRepetido, CompraTableModel currentModel) {
        for (int i = 0; i < currentModel.getRowCount(); i++) {
            int idPlatoTmp = Integer.parseInt(currentModel.getValueAt(i, 1).toString());
            if (idPlatoTmp == idPlatoRepetido) {
                currentModel.removeRow(i);
                this.hayRepetidos = false;
            }
        }
    }

    @Override
    public boolean isCellEditable(int row, int column) {
        return false;
    }

    public class Modelito extends DefaultTableModel {

        @Override
        public Vector getDataVector() {
            Vector vector = super.getDataVector();
            Collections.sort(vector);

            Collections.sort(vector, COMPARATOR_JTABLE);
            return vector;
        }
    }
    
    public static final Comparator<Vector> COMPARATOR_JTABLE = new Comparator<Vector>() {
        public int compare(Vector o1, Vector o2) {
            String elementAt1 = (String) o1.elementAt(1);
            String elementAt2 = (String) o2.elementAt(1);
            return elementAt1.compareTo(elementAt2);
        }
    };
}